package com.iamteer.day19;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
主要回顾：IO 流

IO 技术主要解决设备与设备之间的数据传输问题，如：
	硬盘---->内存
	内存---->硬盘
	键盘---->内存

IO 技术的应用场景：
	导出报表，上传头像，下载文件。。。
	
数据一般以文件的形式保存在硬盘。

File 类：
	File(String pathname);	//指定文件或者文件夹的路径创建一个 File 对象
	File(File parent, String child);	//根据 parent 抽象路径和 child 路径名字字符串创建一个 File 对象
	File(String parent, String child);	//

注意分隔符：
	Linux  /
	Windows \\ 或 /
	
路径：
	绝对路径
	
	相对路径
		. 当前路径
		.. 上级路径

	创建：
		createNewFile();	//在指定位置创建一个空文件，成功返回 true，已经存在则返回 false
		mkdir();			//指定位置创建目录，只能创建一级
		mkdirs();			//指定位置创建目录
		renameTo(File dest);//重命名文件或者文件夹
		
	删除：
		delete();		//删除文件或者空文件夹
		deleteOnExit();	//在虚拟机终止时，删除文件或目录，保证程序异常时创建的临时文件也可以被删除

	判断：
		exists();		//判断文件或者目录是否存在
		isFile();		//判断是否文件
		isDirectory();	//判断是否目录
		isHidden();		//判断是否隐藏文件或隐藏目录
		isAbsolute();	//判断是否绝对路径
		
	获取：
		getName();	//获取文件或者文件夹的名称，不包含上级路径
		getPath();	//返回绝对路径，可以是相对路径，但目录要指定
		getAbsolutePath();	//获取文件的绝对路径，与文件是否存在没关系
		length();	//获取文件的大小，以字节为单位
		getParent();	//
		lastModified();	//
		
	文件夹相关：
		static File[] listRoots();	//列出所有根目录
		list();		//列出所有文件
		list(FilenameFilter filter);	//
		listFiles();		//
		listFiles(FilenameFilter filter);	//
 */

class MyFileter implements FilenameFilter{
	@Override
	public boolean accept(File dir, String name) {
		System.out.println("Dir: " + dir + "\tfile: " + name);
		return name.endsWith(".java");
	}
}

public class IOStream {

	public static void main(String[] args) throws IOException {
//		newFile();		//文件路径
//		createFile();	//创建文件
//		deleteFile();	//删除文件
//		testMethods();	//判断方法
//		getMethods();	//获取方法
//		listMethods();	//列出文件(夹)
		listFilter();	//列出文件(夹)，带过滤器
	}
	
	public static void newFile() {
		File parentFile = new File("/Users/Chuck/Love/Java/Basics");
		File file = new File(parentFile, "README.md");
		System.out.println(file.exists());
		System.out.println(File.separator);
		
		file = new File(".");
		System.out.println(file.getAbsolutePath());
	}
	
	public static void createFile() throws IOException {
		File file = new File(".", "test.txt");
		System.out.println(file.createNewFile());	//不存在时创建成功返回 true，再运行时已经存在了，返回 false
		
		File dir = new File("./a.txt");
		System.out.println(dir.mkdir());	//只创建一级
		dir = new File("./test/a.txt");
		System.out.println(dir.mkdirs());	//可以创建多级
		
		//重命名
		File destFile = new File("./b.txt");
		System.out.println(file.renameTo(destFile));
		
	}

	public static void deleteFile() throws IOException {
		File file = new File("./test.txt");
		System.out.println("create: " + file.createNewFile());
//		System.out.println("delete: " + file.delete());
		file.deleteOnExit();
	}
	
	public static void testMethods() throws IOException {
		File file = new File("./a.txt");
		System.out.println(file.createNewFile());
		System.out.println("exists: " + file.exists());
		System.out.println("isFile: " + file.isFile());
		System.out.println("isDirectory: " + file.isDirectory());
		System.out.println("isHidden: " + file.isHidden());
		System.out.println("isAbsolute: " + file.isAbsolute());
	}
	
	public static void getMethods() throws IOException {
		 File file = new File("../../test.txt");
		 System.out.println(file.createNewFile());
		 System.out.println("File Name: " + file.getName());
		 System.out.println("Path: " + file.getPath());
		 System.out.println("AbsolutePath: " + file.getAbsolutePath());
		 System.out.println("Size: " +  file.length());
		 System.out.println("ParentPath: " + file.getParent());
		 
		 Date date = new Date(file.lastModified());
		 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		 System.out.println("lastModified time: " + dateFormat.format(date));
	}
	
	public static void listMethods() {
//		File[] roots = File.listRoots();
//		for (File file : roots) {
//			System.out.println(file);
//		}
//		
		File file1 = new File("../../");
//		String[] fileNames = file1.list();	//列出文件
//		for (String string : fileNames) {
//			System.out.println(string);
//		}
		
		File[] files = file1.listFiles();	//
		System.out.println("文件夹：");
		for (File file2 : files) {
			if (file2.isDirectory()) {
				System.out.println("\t" + file2.getName());
			}
		}
		System.out.println("文件夹：");
		for (File file2 : files) {
			if (file2.isFile()) {
				System.out.println("\t" + file2.getName());
			}
		}
		
		System.out.println("---------------------------------------");
		for (File file3 : files) {	//只列出 java 文件
			String fileName = file3.getName();
			if (fileName.endsWith(".java")) {
				System.out.println(fileName);
			}
		}
	}

	public static void listFilter() {
		File dir = new File("../../");
		File[] files = dir.listFiles(new MyFileter());
		System.out.println(files.length);
	}
}
